home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / etc / RCS / syslog.c,v < prev    next >
Text File  |  1989-12-11  |  7KB  |  488 lines

  1. head     1.12;
  2. branch   ;
  3. access   ;
  4. symbols  ;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.12
  10. date     89.09.20.17.26.11;  author rab;  state Exp;
  11. branches ;
  12. next     1.11;
  13.  
  14. 1.11
  15. date     89.02.27.17.50.18;  author mgbaker;  state Exp;
  16. branches ;
  17. next     1.10;
  18.  
  19. 1.10
  20. date     89.01.11.14.56.04;  author rab;  state Exp;
  21. branches ;
  22. next     1.9;
  23.  
  24. 1.9
  25. date     89.01.01.21.21.18;  author rab;  state Exp;
  26. branches ;
  27. next     1.8;
  28.  
  29. 1.8
  30. date     88.08.12.17.41.16;  author ouster;  state Exp;
  31. branches ;
  32. next     1.7;
  33.  
  34. 1.7
  35. date     88.07.29.18.59.13;  author ouster;  state Exp;
  36. branches ;
  37. next     1.6;
  38.  
  39. 1.6
  40. date     88.07.29.18.55.09;  author ouster;  state Exp;
  41. branches ;
  42. next     1.5;
  43.  
  44. 1.5
  45. date     88.07.25.14.23.53;  author ouster;  state Exp;
  46. branches ;
  47. next     1.4;
  48.  
  49. 1.4
  50. date     88.07.25.13.13.54;  author ouster;  state Exp;
  51. branches ;
  52. next     1.3;
  53.  
  54. 1.3
  55. date     88.07.25.11.25.21;  author ouster;  state Exp;
  56. branches ;
  57. next     1.2;
  58.  
  59. 1.2
  60. date     88.06.21.17.26.17;  author ouster;  state Exp;
  61. branches ;
  62. next     1.1;
  63.  
  64. 1.1
  65. date     88.06.19.14.32.08;  author ouster;  state Exp;
  66. branches ;
  67. next     ;
  68.  
  69.  
  70. desc
  71. @@
  72.  
  73.  
  74. 1.12
  75. log
  76. @Changed #ifdef's so that sun4's use stdarg.h.
  77. @
  78. text
  79. @/*
  80.  * syslog.c --
  81.  *
  82.  *     Sprite version of 4.3BSD's syslog facilty.
  83.  *
  84.  */
  85.  
  86. /*
  87.  * Copyright (c) 1983 Regents of the University of California.
  88.  * All rights reserved.  The Berkeley software License Agreement
  89.  * specifies the terms and conditions for redistribution.
  90.  */
  91.  
  92. #if defined(LIBC_SCCS) && !defined(lint)
  93. static char sccsid[] = "@@(#)syslog.c    5.10 (Berkeley) 4/20/87";
  94. #endif LIBC_SCCS and not lint
  95.  
  96. /*
  97.  * SYSLOG -- print message on log file
  98.  *
  99.  * This routine looks a lot like printf, except that it
  100.  * outputs to the log file instead of the standard output.
  101.  * Also:
  102.  *    adds a timestamp,
  103.  *    prints the module name in front of the message,
  104.  *    has some other formatting types (or will sometime),
  105.  *    adds a newline on the end of the message.
  106.  *
  107.  * The output of this routine is intended to be read by /etc/syslogd.
  108.  *
  109.  * Author: Eric Allman
  110.  * (Modified to use UNIX domain IPC by Ralph Campbell)
  111.  *    Modified to use the Sprite /dev/syslog, fall 1987
  112.  */
  113.  
  114. #include <sys/types.h>
  115. #include <sys/file.h>
  116. #include <signal.h>
  117. #include <sys/syslog.h>
  118. #include <netdb.h>
  119. #include <strings.h>
  120. #include <stdio.h>
  121. #include <sys/wait.h>
  122.  
  123. #if defined(__STDC__) && !defined(spur) && !defined(sun4)
  124. #include <stdarg.h>
  125. #else
  126. #include <varargs.h>
  127. #endif
  128.  
  129. #define    MAXLINE    1024            /* max message size */
  130.  
  131. #define PRIFAC(p)    (((p) & LOG_FACMASK) >> 3)
  132. #define IMPORTANT     LOG_ERR
  133.  
  134. static char    logname[] = "/dev/syslog";
  135. static char    ctty[] = "/dev/console";
  136.  
  137. static int    LogFile = -1;        /* fd for log */
  138. static int    LogStat    = 0;        /* status bits, set by openlog() */
  139. static char    *LogTag = "syslog";    /* string to tag the entry with */
  140. static int    LogMask = 0xff;        /* mask of priorities to be logged */
  141. static int    LogFacility = LOG_USER;    /* default facility code */
  142.  
  143.  
  144. extern    int errno, sys_nerr;
  145. extern    char *sys_errlist[];
  146. extern    long time();
  147. extern    char *ctime();
  148.  
  149. extern int setlogmask();
  150. extern void closelog();
  151. extern void openlog();
  152.  
  153. #ifndef lint
  154. #if defined(__STDC__) && !defined(spur) && !defined(sun4)
  155. void
  156. syslog(int pri, const char *fmt, ...)
  157. {
  158. #else
  159. void
  160. syslog(va_alist)
  161.         va_dcl
  162. {
  163.         int pri;
  164.     char *fmt;
  165. #endif
  166.     char buf[MAXLINE + 1], outline[MAXLINE + 1];
  167.     register char *b, *o;
  168. #ifdef __STDC__
  169.     register const char *f;
  170. #else
  171.     register char *f;
  172. #endif
  173.     register int c;
  174.     long now;
  175.     int pid, olderrno = errno;
  176.     va_list args;
  177.  
  178. #if defined(__STDC__) && !defined(spur) && !defined(sun4)
  179.     va_start(args, fmt);
  180. #else
  181.     va_start(args);
  182.     pri = va_arg(args, int);
  183.     fmt = va_arg(args, char *);
  184. #endif
  185.     /* see if we should just throw out this message */
  186.     if (pri <= 0 || PRIFAC(pri) >= LOG_NFACILITIES ||
  187.         (LOG_MASK(pri) & LogMask) == 0)
  188.         return;
  189.     if (LogFile < 0)
  190.         openlog(LogTag, LogStat | LOG_NDELAY, 0);
  191.  
  192.     /* set default facility if none specified */
  193.     if ((pri & LOG_FACMASK) == 0)
  194.         pri |= LogFacility;
  195.  
  196.     /* build the message */
  197.     o = outline;
  198.     sprintf(o, "<%d>", pri);
  199.     o += strlen(o);
  200.     time(&now);
  201.     sprintf(o, "%.15s ", ctime(&now) + 4);
  202.     o += strlen(o);
  203.     if (LogTag) {
  204.         strcpy(o, LogTag);
  205.         o += strlen(o);
  206.     }
  207.     if (LogStat & LOG_PID) {
  208.         sprintf(o, "[%x]", getpid());
  209.         o += strlen(o);
  210.     }
  211.     if (LogTag) {
  212.         strcpy(o, ": ");
  213.         o += 2;
  214.     }
  215.  
  216.     b = buf;
  217.     f = fmt;
  218.     while ((c = *f++) != '\0' && c != '\n' && b < &buf[MAXLINE]) {
  219.         if (c != '%') {
  220.             *b++ = c;
  221.             continue;
  222.         }
  223.         if ((c = *f++) != 'm') {
  224.             *b++ = '%';
  225.             *b++ = c;
  226.             continue;
  227.         }
  228.         if ((unsigned)olderrno > sys_nerr)
  229.             sprintf(b, "error %d", olderrno);
  230.         else
  231.             strcpy(b, sys_errlist[olderrno]);
  232.         b += strlen(b);
  233.     }
  234.     *b++ = '\n';
  235.     *b = '\0';
  236.     vsprintf(o, buf, args);
  237.     va_end(args);
  238.     c = strlen(outline);
  239.     if (c > MAXLINE)
  240.         c = MAXLINE;
  241.  
  242.     /* output the message to the local logger */
  243.     if (write(LogFile, outline, c) >= 0)
  244.         return;
  245.     if (!(LogStat & LOG_CONS))
  246.         return;
  247.  
  248.     /* output the message to the console */
  249.     pid = vfork();
  250.     if (pid == -1)
  251.         return;
  252.     if (pid == 0) {
  253.         int fd;
  254.  
  255.         sigsetmask(sigblock(0));
  256.         fd = open(ctty, O_WRONLY);
  257.         strcat(o, "\r");
  258.         o = index(outline, '>') + 1;
  259.         write(fd, o, c + 1 - (o - outline));
  260.         close(fd);
  261.         _exit(0);
  262.     }
  263.     if (!(LogStat & LOG_NOWAIT))
  264.         while ((c = wait((union wait *)0)) > 0 && c != pid)
  265.             ;
  266. }
  267. #else /* lint */
  268. /*VARARGS2*/
  269. /*ARGSUSED*/
  270. void
  271. syslog(pri, fmt)
  272.     int pri;
  273.     char *fmt;
  274. {
  275.     return;
  276. }
  277. #endif /* !lint */
  278.  
  279. /*
  280.  * OPENLOG -- open system log
  281.  */
  282.  
  283. void
  284. openlog(ident, logstat, logfac)
  285.     char *ident;
  286.     int logstat, logfac;
  287. {
  288.     if (ident != NULL)
  289.         LogTag = ident;
  290.     LogStat = logstat;
  291.     if (logfac != 0)
  292.         LogFacility = logfac & LOG_FACMASK;
  293.     if (LogFile >= 0)
  294.         return;
  295.  
  296.     if (LogStat & LOG_NDELAY) {
  297.         LogFile = open(logname, O_WRONLY, 0);
  298.         fcntl(LogFile, F_SETFD, 1);
  299.     }
  300.     return;
  301. }
  302.  
  303. /*
  304.  * CLOSELOG -- close the system log
  305.  */
  306.  
  307. void
  308. closelog()
  309. {
  310.  
  311.     (void) close(LogFile);
  312.     LogFile = -1;
  313.     return;
  314. }
  315.  
  316. /*
  317.  * SETLOGMASK -- set the log mask level
  318.  */
  319. int
  320. setlogmask(pmask)
  321.     int pmask;
  322. {
  323.     int omask;
  324.  
  325.     omask = LogMask;
  326.     if (pmask != 0)
  327.         LogMask = pmask;
  328.     return (omask);
  329. }
  330. @
  331.  
  332.  
  333. 1.11
  334. log
  335. @Fixed things so sun4 cpp will work.
  336. @
  337. text
  338. @d71 4
  339. d90 1
  340. a90 1
  341. #if !defined (sun4)
  342. d205 1
  343. d222 1
  344. d229 1
  345. d235 1
  346. d241 1
  347. @
  348.  
  349.  
  350. 1.10
  351. log
  352. @Fixed syslog to take variable # of args.
  353. @
  354. text
  355. @d45 1
  356. a45 1
  357. #if defined(__STDC__) && !defined(spur)
  358. d72 1
  359. a72 1
  360. #if defined(__STDC__) && !defined(spur)
  361. d86 1
  362. d88 3
  363. d96 1
  364. a96 1
  365. #if defined(__STDC__) && !defined(spur)
  366. @
  367.  
  368.  
  369. 1.9
  370. log
  371. @Fixed syslog to take a variable number of arguments.
  372. @
  373. text
  374. @d45 1
  375. a45 1
  376. #ifdef __STDC__
  377. d72 1
  378. a72 1
  379. #ifdef __STDC__
  380. d75 1
  381. d78 5
  382. a82 4
  383. syslog(pri, fmt, va_alist)
  384.     int pri;
  385.     char *fmt;
  386.     va_dcl
  387. a83 1
  388. {
  389. d92 7
  390. a149 5
  391. #ifdef __STDC__
  392.     va_start(args, fmt);
  393. #else
  394.     va_start(args);
  395. #endif
  396. @
  397.  
  398.  
  399. 1.8
  400. log
  401. @Reduce lint messages from syslog.
  402. @
  403. text
  404. @d45 6
  405. d71 11
  406. a81 4
  407.     /* VARARGS2 */
  408. syslog(pri, fmt, p0, p1, p2, p3, p4)
  409.     int pri;
  410.     char *fmt;
  411. d84 2
  412. a85 1
  413.     register char *b, *f, *o;
  414. d89 1
  415. d142 7
  416. a148 1
  417.     sprintf(o, buf, p0, p1, p2, p3, p4);
  418. d178 11
  419. @
  420.  
  421.  
  422. 1.7
  423. log
  424. @Lint.
  425. @
  426. text
  427. @d65 1
  428. @
  429.  
  430.  
  431. 1.6
  432. log
  433. @Lint.
  434. @
  435. text
  436. @d43 1
  437. @
  438.  
  439.  
  440. 1.5
  441. log
  442. @Lint.
  443. @
  444. text
  445. @d152 1
  446. a152 1
  447.         while ((c = wait((int *)0)) > 0 && c != pid)
  448. @
  449.  
  450.  
  451. 1.4
  452. log
  453. @Lint.
  454. @
  455. text
  456. @a44 1
  457. #define NULL    0            /* manifest */
  458. @
  459.  
  460.  
  461. 1.3
  462. log
  463. @Lint.
  464. @
  465. text
  466. @d42 1
  467. @
  468.  
  469.  
  470. 1.2
  471. log
  472. @Get headers from right place.
  473. @
  474. text
  475. @d61 2
  476. @
  477.  
  478.  
  479. 1.1
  480. log
  481. @Initial revision
  482. @
  483. text
  484. @d38 1
  485. a38 1
  486. #include <sys/signal.h>
  487. @
  488.